//
//  seqlist.c
//  11.4.c
//
//  Created by 仲7 on 2024/11/4.
//
#include"seqlist.h"
//初始化
void SLInit(SL* ps) {
 ps->arr = NULL;
 ps->capacity = ps->size = 0;
}
//销毁
void SLDestroy(SL* ps) {
 if (ps->arr) {
  free(ps->arr);
 }
 ps->arr = NULL;
 ps->capacity = ps->arr = 0;
}
//检测顺序表空间是否足够,以便后续使用。
//若空间不足则进行增容
void SLcheckCapacity(SL* ps)
{
    if (ps->size == ps->capacity)
    {
        ps->capacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
        SLDatatype* tmp = (SLDatatype*)realloc(ps->arr, sizeof(SLDatatype) * ps->capacity);
        //增容失败，直接退出。
        if (tmp == NULL)
        {
            perror("realloc fail!");
            exit(1);
        }
        ps->arr = tmp;
    }
}
//尾插
void SLPushback(SL* ps, SLDatatype x) {
    if(ps == NULL){
        return;
    }
    SLcheckCapacity(ps);
 ps->arr[ps->size] = x;
 ps->size++;
}

//头插
void SLPushfront(SL* ps,SLDatatype x)
{
    if(ps == NULL)//判断顺序表是否空，因为无法对一空的结构体进行解引用
    {
        return;
    }
    //或使用 assert(ps);
    SLcheckCapacity(ps);
    for (int i = ps->size; i > 0; i--)
 {
  ps->arr[i] = ps->arr[i - 1];
  
 }
    ps->arr[0] = x;
    ps->size++;
}
//打印
void SLPrint(SL* ps) {
 for (int i = 0; i < ps->size; i++)
 {
  printf("%d ", ps->arr[i]);
 }
 printf("\n");
}
//头删
void SLPopfront(SL* ps)
{
    assert(ps);
    assert(ps->size);//顺序表中的有效元素个数也不能为零
    SLcheckCapacity(ps);
    for (int i = 0; i<ps->size; i++) {
        ps->arr[i] = ps->arr[i+1];
    }
    ps->size--;
}
//尾删
void SLPopback(SL* ps)
{
    assert(ps);
    assert(ps->size);
    SLcheckCapacity(ps);//检查空间是否足够
    ps->arr[ps->size-1] = 0;//词条语句无实际意义，可写可不写
    ps->size--;
}
//顺序表的查找
int SLFind(SL* ps,SLDatatype x)
{
    assert(ps);
    assert(ps->size);
    int i = 0;
    while( i != ps->size)
    {
        if(ps->arr[i] == x)
        {
            return i;
        }
        i++;
    }
    //没找到，返回无效下标
    return -1;
}
//在指定位置插入数据
void SLInsert(SL* ps,SLDatatype x,int pos)
{
    assert(ps);
    assert(ps->size);//可以不用检测，因为即使 size 为0，pos 依旧能插入
    assert(pos >= 0 && pos < ps->size);//指定位置 pos 必须在”0”到“有效数据size”之间
    SLcheckCapacity(ps);
    for (int i = ps->size; i > pos; i--) {
        ps->arr[i] = ps->arr[i-1];
    }
    ps->size++;
    ps->arr[pos] = x;
}
//在指定位置删除数据
void SLErase(SL* ps,int pos)
{
    assert(ps);//顺序表是否为空检测
    assert(ps->size);//有效数据检测
    assert(pos >= 0 && pos < ps->size);//指定位置 pos 必须在”0”到“有效数据size”之间
    for (int i = pos; i<ps->size; i++) {
        ps->arr[i] = ps->arr[i+1];
    }
    ps->size--;
}
